package com.scalar.chiptrack.adaptor.spil;

import com.scalar.chiptrack.utils.Logger;
import com.scalar.chiptrack.utils.StringUtils;
import com.scalar.chiptrack.users.VendorAdaptor;
import com.scalar.chiptrack.users.dao.AdaptorSetUpDAO;
import com.scalar.chiptrack.adaptor.AdaptorUtils;
import com.scalar.chiptrack.adaptor.AdaptorConstants;
import com.scalar.chiptrack.adaptor.dao.AdaptorRunInfo;
import com.scalar.chiptrack.jobs.JobHandler;
import com.scalar.ScalarException;

import javax.mail.*;
import java.util.Properties;
import java.util.Date;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.IOException;

/**
 * User: ChandraSekhar
 * Date: Sep 26, 2007
 * Time: 11:05:11 AM
 */
public class SPILPOP3Adaptor extends JobHandler implements AdaptorConstants
{
    private static final String HOST = "mail.scalarsoft.com";

    public static final String ADAPTOR_NAME = "SPILTW_WIP";
    public static final String SPILTW_SUBJECT = "LS WIP-SPILTW";
    public static final String WIP_FILE_NAME = "LS_WIP_SPILTW";

    private Logger m_adaptorLogger = null;
    private String m_dataOutputDir = null;
    private String m_username = null;
    private String m_password = null;
    private int    m_adaptor_id     = -1;
    /**
     * @throws Exception
     */
    public SPILPOP3Adaptor() throws Exception
    {
        try
        {
            VendorAdaptor vendorAdaptor = AdaptorSetUpDAO.getVendorAdaptorDetailsByVendorNameAndLocation(VENDOR_NAME_SPIL, WIP_TYPE_ASSEMBLY );

            m_username = vendorAdaptor.getUserId();
            m_password = vendorAdaptor.getPassWord();
            m_dataOutputDir = vendorAdaptor.getOutPutDirectory();

            if ( m_dataOutputDir != null )
            {
                if (m_dataOutputDir.endsWith("/") || m_dataOutputDir.endsWith("\\"))
                {
                    m_dataOutputDir = m_dataOutputDir + m_username;
                }
                else
                {
                    m_dataOutputDir = m_dataOutputDir + "/" + m_username;
                }
               AdaptorUtils.makeAllAdaptorDirs( m_dataOutputDir );
               m_adaptorLogger = AdaptorUtils.getAdaptorLogger( m_dataOutputDir, VENDOR_NAME_SPIL );
                AdaptorUtils.setLogger( m_adaptorLogger );
            }
        }
        catch (ScalarException se)
        {
            log("ERROR!! ERROR!! ERROR!! Exception while loading SPIL TW Adaptor Username, Password details from database, Exception: " + se);
            throw se;
        }
    }

    //Main Method
    public static void main(String[] args) throws Exception
    {
        new SPILPOP3Adaptor().execute();
    }

    /**
     * @throws Exception
     */
    public void execute() throws Exception
    {
       try
        {
            m_adaptor_id = AdaptorRunInfo.saveAdaptorLastUpdatedStatus( CONSTANT_ADAPTOR, ADAPTOR_NAME, CONSTANT_SUCCESS, -1);

            //Print the header details
            AdaptorUtils.printHeader(VENDOR_NAME_SPIL+" TW", CONSTANT_ADAPTOR);

            AdaptorUtils.removeOldFiles( m_dataOutputDir, m_adaptorLogger );

            // Step 3
            //Retrive All the Messages
            Message[] messages = AdaptorUtils.getAllPOP3InboxMessages( HOST, m_username, m_password);
            // Step 4
            // Retrieve & Saves the latest message
            AdaptorUtils.readLatestMessage( m_adaptor_id, messages, SPILTW_SUBJECT,  m_dataOutputDir, FILE_EXTN_XLS, WIP_FILE_NAME );

        }
        catch (Exception e)
        {
            AdaptorUtils.removeOldFiles(m_dataOutputDir, m_adaptorLogger);
            AdaptorRunInfo.updatedAdaptorStatus( CONSTANT_FAILURE, m_adaptor_id);
            System.out.println("Exception while trying to connect and read data from " + HOST +" site: " + e);
            log("Exception while trying to connect and read data from " + HOST +" site: " + e);
            e.printStackTrace();
            throw e;
        }
    }

    private void log(String message) {

        if (message == null) return;

        if (m_adaptorLogger != null) {
            synchronized (m_adaptorLogger) {
                m_adaptorLogger.logDebug(message + LINE_SEPARATOR);
            }
        } else {
            System.out.println(message);
        }

    }

}

